(function(){
	'use strict';

	/**
	 * 线路日历扩展组件 extend & custom display on {zhxBaseCalendar}
	 * 该组件为日历格子指令的自定义控制器，可以在此控制器内扩展日历格子的显示模板与事件绑定
	 * 
	 * 注意：该控制器与日历格子共享同一作用域与DOM对象 [ $scope , $element, $options ]
	 * 
	 * Author: Vicco Wang
	 * Date : 2016.10.19
	 * 
	 */
	var cal = angular.module('zhxCalExtendLine', ['zhxBaseCalendar','zhxCalExtendTpl']);
	
	/**
	 * [日历格子自定义控制器，负责自定义日历每个格子内展示的业务]
	 * @param  {[object]}  $scope                                 [日历格子的作用域]
	 * @param  {[object]}  $element                               [日历格子的DOM对象]
	 * @param  {[object]}  $options 							  [用户自定义的日历options对象]
	 * @param  其他服务为依赖注入
	 */
	cal.controller('zhxExtendLineCtrl',['$scope','$element','$options','$compile','$timeout','zhxBaseCalUtils','$templateCache',
								function($scope,$element,$options,$compile,$timeout,zhxBaseCalUtils,$templateCache){

		/**
		 * 日期格子渲染
		 * @return {[type]} [description]
		 */
		var __render = function(){

			if( angular.isUndefined($scope.day.userExtendProp) ) return;

			//顶部展示
			$scope.pinProp = {};
			//中间横排显示
			$scope.listProp = [];
			/**
			 * 使用接收到的数据重新整理，并整合进模板中进行展示
			 */
			for( var i = 0; i < $options.displayOptions.length; i++ ){
				var opts = $options.displayOptions[i];
				if( opts.pin ){
					$scope.pinProp = opts;
				} else {
					$scope.listProp.push( opts );
				}
			}

			/**
			 * 自定义日历的模板，与渲染方法协调使用
			 */
			var __renderTpl =  $templateCache.get('zhxCalExtendTpl.day.vicco');

			//编译添加至DOM中
			$scope.$evalAsync(function(){
				$element.append( $compile(__renderTpl)($scope) );	
			});

			// console.log( 'render: ' + moment().format('ss SSS') + 'ms' );

		}();

		//以下为绑定事件，添加一个延迟加速页面渲染处理速度
		$timeout(function(){
			/**
			 *
			 * 以下为模板绑定的event事件，事件名称同时需要定义在模板的对应DOM节点上
			 * 
			 */
			//日历格子父DOM节点
			var $calendarBody = $element.parents('.zhx-cal-body');
			/**
			 * 日期格子点击事件，通过TIP展示出所有内容
			 *
			 * @param  {[ object ]} event [doc event]
			 */
			$scope.__showDayDetail = function(event){
				var ev = event || window.event;
				ev.stopPropagation();

				var tipScp = $scope.$new();

				var tipTpl = $templateCache.get('zhxCalExtendTpl.day.layer.vicco');
				/**
				 * 创建一个弹出层，共日历扩展使用
				 * @param  {[type]} event      [widnow事件对象]
				 * @param  {[type]} dom        [一个HTML字符串，可以直接添加进弹出层中]
				 * @param  {[type]} compileScp [作用域，传递了该作用域后则会进行Angular编译]
				 * @param  {[type]} isolate    [是否为独立作用域，如果使用了独立作用域，则在移除弹出层时会自动销毁该作用域]
				 * @return {[type]}            [一个编译否的弹出层对象]
				 */
				var tip = zhxBaseCalUtils.createCalLayer(ev, tipTpl, tipScp, true);
				
				$calendarBody.append(tip);

			};

			/**
			 * [__showDayTip description]
			 * @param  {[type]} event [description]
			 * @param  {[type]} targ  [description]
			 * @return {[type]}       [description]
			 */
			$scope.__showDayTip = function( event, prop ){
				var ev = event || window.event;
				ev.stopPropagation();
			};

			/**
			 * 日期个字右键点击事件，展示一些功能菜单
			 * @param  {[ object ]} event [ doc event ]
			 */
			$scope.__showContextMenu = function(event){
				var ev = event || window.event;

				var ctxScp = $scope.$new();

				var ctxMenu = $templateCache.get('zhxCalExtendTpl.day.contextLayer.vicco');
					ctxMenu = zhxBaseCalUtils.createCalLayer(ev, ctxMenu, ctxScp, true);

				$calendarBody.append(ctxMenu);

				/**
				 * 一个测试的右键事件
				 * 该事件在模板中进行定义并使用该右键作用域ctxScp进行绑定
				 * @param {[object]} event [右键点击事件对象]
				 */
				ctxScp.addNew = function(event){
					//因为作用域使用$new()进行了继承，因此这里可以直接取day.__mDate获取日期
					console.log('Now Date is: ' + ctxScp.day.__mDate.format('YYYY-MM-DD') )
					console.log('userExtendProp: ', ctxScp.day.userExtendProp );
				};

			};

		},50,false);

	}]);

})()